﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace Marmat.Foundation
{
    /// <summary>
    /// 搜索组件的筛选条件的集合。
    /// </summary>
    public interface ISearchControlFilterCollection : IEnumerable<ISearchControlFilter>
    {

        /// <summary>
        /// 添加字段的筛选规则。
        /// </summary>
        /// <param name="name">字段的名称</param>
        /// <param name="caption">字段的标题，如需要显示为默认值，可传入 null 或 string.Empty。</param>
        /// <param name="dataType">字段的类型</param>
        /// <param name="condition">字段支持的自定义条件，关键字请使用{0}替换。</param>
        void AddField(string name, string caption, Type dataType, string condition = null);

        /// <summary>
        /// 添加分组筛选的规则。
        /// </summary>
        /// <param name="name">分组的名称</param>
        /// <param name="caption">字段的标题，如需要显示为默认值，可传入 null 或 string.Empty。</param>
        /// <param name="condition">分组的自定义条件，暂不支持使用{0}关键字进行替换。</param>
        void AddGroup(string name, string caption, string condition);

        /// <summary>
        /// 通过传递的类自动生成所有公开的属性作为筛选条件。
        /// </summary>
        void Add<TEntity>();

        /// <summary>
        /// 添加筛选字段的集合。
        /// </summary>
        /// <param name="columns"></param>
        void Add<TEntity>(params string[] columns);

        /// <summary>
        /// 通过表达式添加筛选字段的规则。
        /// </summary>
        /// <param name="expression"></param>
        void Add<TEntity>(Expression<Func<TEntity, object>> expression);

        /// <summary>
        /// 移除指定名称的筛选规则。
        /// </summary>
        /// <param name="name"></param>
        void Remove(string name);

        /// <summary>
        /// 清除所有筛选规则。
        /// </summary>
        void Clear();
    }
}
